package 算法基础模板.chapter_01.双指针.sliding_window;

/**
 * 1658. 将 x 减到 0 的最小操作数
 * 给你一个整数数组 nums 和一个整数 x 。每一次操作时，你应当移除数组 nums 最左边或最右边的元素，然后从 x 中减去该元素的值。请注意，需要 修改 数组以供接下来的操作使用。
 *
 * 如果可以将 x 恰好 减到 0 ，返回 最小操作数 ；否则，返回 -1 。
 *
 *
 *
 * 示例 1：
 *
 * 输入：nums = [1,1,4,2,3], x = 5
 * 输出：2
 * 解释：最佳解决方案是移除后两个元素，将 x 减到 0 。
 * 示例 2：
 *
 * 输入：nums = [5,6,7,8,9], x = 4
 * 输出：-1
 * 示例 3：
 *
 * 输入：nums = [3,2,20,1,1,3], x = 10
 * 输出：5
 * 解释：最佳解决方案是移除后三个元素和前两个元素（总共 5 次操作），将 x 减到 0 。
 * @author Summerday
 */
public class LC1658 {

    public int minOperations(int[] nums, int x) {
        int sum = 0;
        for(int num : nums) sum += num;
        int t = sum - x;
        if(t < 0) return -1;
        if(t == 0) return nums.length;
        int l = 0, r = 0, ans = -1, s = 0;
        // 扩展右边界
        while(r < nums.length){
            s += nums[r];
            while(s >= t){
                if(s == t){
                    ans = Math.max(ans, r - l + 1);
                }
                // 缩减 左边界
                s -= nums[l ++];
            }
            r ++;
        }
        if(ans == -1) return -1;
        return nums.length - ans;
    }
}
